﻿// See https://aka.ms/new-console-template for more information
using ConsoleDump;
using EFCore_Test.AppDBContext;
using EFCore_Test.Serivces;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

string ConnectionString = "server=.;database=EFCoreTestModel;uid=sa;pwd=123456;TrustServerCertificate=true";

var serviceProvider = new ServiceCollection()
    //默认为作用域生命周期，因为efcore dbcontext默认为不线程安全的，相当于每次请求都是一个单独的实例
    .AddDbContext<ApplicationContext>(builder =>
    {
        builder.UseSqlServer(ConnectionString);
    })
    //请求上下文池，效果类似于线程池，每次使用都会重置上下文的信息,在高并发场景下会有一定的性能提升，几乎可以忽略不计
    //.AddDbContextPool<ApplicationContext>(builder =>
    //{
    //    builder.UseSqlServer(ConnectionString);
    //})
    .AddTransient<IAccountService, AccountService>()
    .BuildServiceProvider();

//var accountService=serviceProvider.GetService<IAccountService>();

var context = serviceProvider.GetService<ApplicationContext>();

//实体操作，efcore在7.0之前都没有批量操作，ef团长在第一考虑安全性的前提下，任何操作都应建立在实体的前提。
//因此，在实体操作的情况下，实体批量操作会导致集合中的每个实体都生成单独的更新语句
//var accounts = context.Accounts.Where(x => x.Age >= 1);
//foreach (var account in accounts)
//{
//    account.Age = 123;
//}
//context.SaveChanges();

//ef批量操作，批量操作无法实现实体追踪 7.0之后添加的批量操作
//context.Accounts.Where(x => x.Age >= 100).ExecuteUpdate(x => x.SetProperty(t => t.Age, t => t.Age + 10).SetProperty(t => t.Name, "321"));

var obj=context.Accounts.ToList();

Console.WriteLine(obj.Dump());